если нужно чтобы здание обязательно было зданием, то можно делать здание с нулевой моделью, потом сделать даммика-боевую еденицу со скоростью ходьбы выше 0 с моделью нашего здания и способностью москиты, так что его нельзя будет выбрать, и создавать наш даммик на месте здания без модели, так как даммика можно вращать, то можно иммитировать разворот здания.
If you know what i mean.
Скачиваешь этот файл: xgm.guru/files/100/179980/comments/336580/War3Patch.txt
Далее открываешь архив War3Patch.mpq в редакторе mpq (например Ladik's MPQ Editor) и используешь файл в качестве listfile.
Модель будет лежать по этому пути: Units\Creeps\HeroTinker\HeroTinker.mdx
Ты это для опыта все такие вопросы задаешь?
Убрать у скила такое последствие или триггерно(как всегда).Поставь своему магу 0манны и скилу 0 и кд на скилл и отниматься не чего не будет.
Нет, дело в том что ветра и шипы неруба берут модель героя и крепят к кости спецэффекта, а потом ставят все на место ( Юнит а это время стоит на земле). Так что только кастом шипы. Можно посмотреть код в доте Фрога, там кто то умный писал заменитель шипов для доты.
В РО, такое невозможно сделать. Подробно на триггерах? Ну вот пример, а если нужно ещё подробнее, то учебник по Jass в руки.
На проклятие в РО,или любой другой спелл,ставится минимальная дистанция
function Trig_Spell_Actions takes nothing returns nothing
local location loc = Location(GetWidgetX(GetSpellAbilityUnit()),GetWidgetY(GetSpellAbilityUnit()))
local unit u = null
if GetSpellAbilityId() == 'АЙ ДИ СКИЛЛА' then
set u = CreateUnitAtLoc(GetOwningPlayer(GetSpellAbilityUnit()),'АЙ ДИ ДАММИ ЮНИТА-ЭФФЕКТА',loc,0.00)
call IssueTargetOrder(u,"curse",GetSpellTargetUnit())
endif
call RemoveLocation(loc)
set loc = null
endfunction
//===========================================================================
function InitTrig_Spell takes nothing returns nothing
local integer i = 0
set gg_trg_Spell = CreateTrigger()
loop
exitwhen i > 12
call TriggerRegisterPlayerUnitEvent(gg_trg_Spell, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set i = i + 1
endloop
call TriggerAddAction( gg_trg_Spell , function Trig_Spell_Actions )
endfunction
Потом тоже самое, только отследить каст проклятия, проверить тип юнита и удалить его из игры.
Drulia_san, Ну да.
Добавляешь аурку - вот тебе баф на юните. Самый простой способ как по мне.
+Можно эффекты настроить, что вполне неплохо. Пока висит фейковый баф(наша аура) - на юните есть эффект.
Через дамми касты я пробовал, но долго+муторно+подключается дамми система = +лаги и местами утечки.
Насчёт таймаута - это уже по самим спеллам, я долго мучался чтобы оно всё работало как надо и не оверлапалось
Вот такой штукой у меня удаляется баф:
public function unitRemoveAbilityandBuffBY(unit u,integer dhv,integer mLv) returns boolean
boolean b=UnitRemoveAbility(u,dhv)
UnitMakeAbilityPermanent(u,false,dhv)
UnitRemoveAbility(u,mLv)
return b
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
"Скилл джаггера их доты" выложен в миллион и одном месте, даже я делал разбор - xgm.guru/p/wc3/omnislash
Реализация примитивна, мгновенное перемещение к цели и приказ атаковать, можно так же эмитировать атаку анимацией и уроном от лица героя как сделано в доте.
Таких багов много, почему то оптимизатор берет данные из слк таблиц игры на часть объектов, пробуй wc3ultimate opt, на хайве выложена... Мб кто уже и новый виджитайзер запилил.
Эффекты стакаются в одном регионе (и даже чуть дальше него) крайне сложным образом, и зависит их совместимость от равкода. Я, когда писал погоду для морлоков с этим сталкивался, и возможно описывал проблему... лет 10 назад) Лечится импортом своей таблицы с погодой и подборкой равкодов. Ну и как вариант для более сильного дождя например можно вместо попытки добавить 2 эффекта и той-же таблице просто прописать побольше частиц.
Чтобы при подборе меча игрались анимации для меча - можно укзать
Анимация - add animation tag to unit - first например. Будут проигрываться attack first, walk first и т.д. При отсутствии таковых будут играться бестеговые анимации.
Теги не какие попало добавляются, насколько я помню.
Используемые теги: fast, victory, first, second,third, fourth, fifth, swim, ready, alternate.
копируй эту модель, у одной оставь анимации для ближнего боя, у другой если нужно дальнего,а если те все анимации в одном нужны то перекликивай с помощью способностей(Перевоплощение(илидан),Аватар(горный король),свинкс(руной добавляй) и подобные) или тригерно с помощью функции call AddUnitAnimationProperties(u, "Alternate", false(true))
Удалил я ренж анимацию, теперь все милишные кривые писец, шо делать?
странно, но в любом случае, я снова дал не ту, эта именно обновляет скин - мороз, оживление, вот это всё пересчитывает. Вот функция смены модели:
function ChangeUnitModelTo takes unit u, string modelpath returns nothing
local integer a
local integer s
set LastConvertedHandle=ConvertHandle(u)
if LastConvertedHandle>0 then
set a=RMem(LastConvertedHandle)+0x88
if a>0 then
set a=RMem(a)
if a>0 then
set s=GetStringAddress(modelpath)
call CallThisCallWith3Args(a,LastConvertedHandle,s,1)
endif
endif
endif
endfunction
Под триггером спецэффекта -установить переменную > effect = последний спецэффект- а в переменных создай переменную спец эффекта, и назови как удобно. А потом когда нужно удалиш этот спецэффект
Ах, я понял чего ты хочешь конкретно сейчас. Чтобы модель смотрела в камеру, словно на экране выбора персонажа? В таком случае ситуация немного упрощается.
Нам больше не нужно хранить текущую матрицу поворота эффекта, ведь мы не производим ее вращение, вместо этого мы высчитывает всю необходимую ориентацию из положения камеры и самого эффекта. Подход, в целом, остается прежним, но для поиска осей ориентации мы теперь будем использовать некоторый вспомогательный вектор, чье направление совпадает с направлением глобальной оси Z, и путем векторного произведения этого вспомогательного вектора на вектор оси X эффекта (получаемый как и прежде p2 - p1) мы получаем вектор ориентации эффекта Y, а векторное произведение X на Y нам даст ось Z эффекта.
Весь процесс можно разжевать на множество абзацев, но делать этого нет смысла. Я проще скину твою карту с новым вариантом.
Тем не менее, я вижу некоторое непонимание темы и потому считаю должным указать на некоторые ошибки в твоем прошлом коде
Код
private function RotationMatrixToEuler takes MATRIX3 R returns VECTOR3
local real x
local real y
local real z
local real sy = SquareRoot(R.m11 * R.m11 + R.m21 * R.m21)
local boolean singular = sy < .000001 or sy == 0 // If
if not singular then
set x = Atan2(R.m32 , R.m33)
set y = Atan2(-R.m31, sy)
set z = Atan2(R.m21, R.m11)
else
set x = Atan2(-R.m23, R.m22)
set y = Atan2(-R.m31, sy)
set z = 0
endif
return VECTOR3.New_1(x, y, z)
endfunction
Я не понимаю, как работает эта функция. В моем понимании, преобразование матрицы поворота в углы Эйлера происходит за счет обратного преобразования. То есть, чтобы преобразовать матрицу в Эйлер, необходимо знать как преобразуется Эйлер в матрицу, поскольку это обратные друг другу процессы. В новом примере я ее переписал.
Код
set rotation.m11 = X.x
set rotation.m12 = X.y
set rotation.m13 = X.z
set rotation.m21 = Y.x
set rotation.m22 = Y.y
set rotation.m23 = Y.z
set rotation.m31 = Z.x
set rotation.m32 = Z.y
set rotation.m33 = Z.z
Здесь идет неверное назначение параметров матрицы. Дело в том, что матрица записывается следующим образом (из readme библиотеки Math)
m11 m12 m13
m21 m22 m23
m31 m32 m33
При этом, оси записываются слева направо, столбиками, то есть , ось X здесь, это m11, m21 и m31. Следовательно верной записью будет
Код
set rotation.m11 = X.x
set rotation.m21 = X.y
set rotation.m31 = X.z
set rotation.m12 = Y.x
set rotation.m22 = Y.y
set rotation.m32 = Y.z
set rotation.m13 = Z.x
set rotation.m23 = Z.y
set rotation.m33 = Z.z
И самая ложная строка
set rotation = MATRIX3.New_0()
Это создаст нулевую матрицу, то есть матрицу, все значения которой - нули. Базовая же матрица поворота, это единичная матрица, то есть матрица, чья главная диагональ состоит из единиц, а все остальное - нули.
Но это просто заметки, в текущей версии этих участков кода больше нет.
Определил причину невидимости модели после сохранения в war3me. В Geoset Animation Manager должна стоять Alpha 1, а он почему-то делает 0 или -1.
Поставил в Geoset Animation Manager не глобальные Color и Alpha, а для первых кадров всех 6 анимаций. Стало всё нормально и триггерные костыли не нужны.
Модель красного свечения ауры на юнитах:
Возможно идёт перезапись переменных, из-за чего не всё удаляется. Актуально с глобалками
Смотрите в сторону мультиплеерности.
Если в ваших тестах с одним героем всё хорошо, то не факт что всё будет хорошо, если одновременно кастанутся 2 одинаковых спелла, которые построены на одних и тех же переменных.
Группы юнитов + хэш или структуры. При касте спелла берешь кастера, берешь его ID, проверяешь не записана ли группа в какой-либо из ячеек. Если нет - создаешь группу и записываешь её в ячейку. При смерти юнита делаешь проверку не записана ли по его ID группа юнитов - если записана - удаляешь его и проверяешь количество юнитов в группе и если оно равно 0 - удаляешь группу. Естественно хэш тоже чистишь всюду где нужно.
Это звучит как "Сделайте мне пожалуйста систему формаций". Чтобы научить тебя как это сделать придётся потратить несколько десятков часов. И тут 2 варианта: либо ты будешь читать статьи и выучишь всё сам, либо обращайся к отдельным пользователям и проси о приватных, платных, уроках в частном порядке.
Вопрос вообще ни о чём. То, о чём ты спрашиваешь делается за 20-30 минут + несколько часов на всякие плюшки и дебаг (в худшем случае).
Переменная "точка" это не просто два числа.
Она хранит объект - ссылку на место в памяти, где хранятся эти два числа.
Пока ты не вызовешь RemoveLocation, эта точка будет висеть в памяти.
Когда ты присваиваешь переменной новое значение, старый объект не удален, но появляется новый объект с другими координатами, и твой триггер создает 200 точек в секунду.
Чтобы поменять координаты не создавая новый объект, есть функция MoveLocation
после разложения костей юниты сами выгружаются из памяти
функция "wait" то же вызывает утечки
она не вызывает утечки, она сама по себе кривая и не подходит под большинство задач
если создать переменную "Point" типа "точка" и изначально задать ей положение центр области "Final", а потом обращаться уже к этой переменной "Point" в триггере событие "боевая единица входит в область "Start", действие "отдать приказ боевой единице следовать в "Point" , то новые точки создаваться не будут?
да
только в гуи еще и создание юнитов утекает тоже насколько я помню, надо тоже заранее точку делать
впринципе можно было бы обойтись одной точкой на все действия, но вам видимо пока рано
Надо, конечно, взглянуть на триггеры в карте, но при спавне удалять нужно не только точки, но и группы, так как при спавне создаются не только юниты, но и группа для них (даже из одного юнита группы). Без утечек создание юнитов выглядит так:
Если отдаёшь приказ группе юнитов отправиться в область, там тоже создаётся группа и точка, тоже нужны эти custom script. Но вообще сомнительно, что это вызывает дикие лаги через два часа. Наверное, есть какие-то события с малым периодом, что тоже плодят утечки, поэтому и надо триггеры в карте смотреть.
В РО у способности есть есть строка Графика - Анимации, там указываешь ту, что хочешь видеть при её использовании. Например, для Огненных стрел Жрицы Луны используется анимация attack, для Молота бурь Горного Короля анимация spell throw, а для Покоя Хранителя Рощи анимация spell channel. Для двух последних способностей в РО указывается два слова, оба слова через пробел не работают, например, указывай отдельно spell и throw или spell и channel. Если у модели нет анимаций с таким названием, но есть анимации, которые содержат одно из этих слов, то будут проигрываться они. Там ещё есть тонкости, о которых долго печатать надо, да и они тебе могут не понадобиться. Пробуй.
EHP_Sequence, они лишь кажутся сложными. По сути триггеры в графическом виде интерпретируют язык программирования, на котором написана вся игра. Попробуй для начала в изначальном триггере добавить действия из категории Видимость - Disable Fog of War и Disable Black Mask, они откроют всю карту. Потом добавь действие из категории Игрок - самое первое, оно установит стартовое количество золота первому игроку. Порассматривав их и поразбиравшись, поймёшь, что это просто ещё дополнительные функции редактора.
А так по идее есть один вариант через Редактор объектов, который не проверял, потому что это зашквар какой-то) Найди для предмета способность Книга заклинаний, нажми Ctrl+D, чтобы слева в РО увидеть её равкод, добавь эту способность юниту, нажав Shift+Enter в поле способностей, и введя равкод книги, в книгу же добавь равкоды юнитов или предметов, которые хочешь сделать дополнительными.
Ну, там (в разделе редактирования объектов в под-разделе <<Характеристика>>) у героя (как и у всех боевых единиц) есть параметр <<Задержка перед первым пополнением>>. Ставишь на 0 и всё, герой будет готов уже на старте игры.
Запрещено создавать несколько вопросов в одном. Бот мог бы выдать к каждому вопросу аналогичные вопросы, которые уже задавались и были решены, а так выдал ерунду какую-то. Можно сделать всех юнитов героями, убрать у них пиктограмму в левой верхней части экрана и добавить триггер, если юнит умирает, который не относится к настоящим героям, то сменить владельца на какого-нибудь нейтрала.
Покупка способностей делается через способность Техника, поищи на сайте более подробное описание.
Возможность выделить много юнитов, как одного есть, но это очень сложный костыль надо делать. Да и не факт, что получится чисто. Надо делать модель круга выделения, делать триггер, который отлавливает выбор игрока и при наличии нужного количества однотипных юнитов убирает из выбора остальных, дав им модель круга выделения, другой триггер будет отлавливать все приказы выбранному юниту и отдавать их псевдовыбранным, третий триггер будет выделение снимать.
antonpoganui, простой принцип выделения индекса. Нужно сделать такую систему для твоей карты, которая будет выделять свободный индекс в параллельных массивах переменных, которые используются в способности (например unit array caster, group array target - то есть массив боевых единиц-кастеров и массив групп боевых единиц-целей). При каждом применении выделять свободную ячейку в массивах и записывать по данному индексу информацию про текущую магию. Также, есть вариант использования локальных переменных, если магия не слишком сложная и без периодика. Например, создаешь локальные переменные через личный код (Custom Script), названия которых будут совпадать с названиями глобальных переменных, созданных с помощью редактора триггеров (если у тебя переменная "Боевая единица Caster", то на личном коде это будет "local unit udg_Caster". Данные переменные необходимо объявить в начале действий, а потом обращаться к обычной глобалке, но редактор будет подразумевать это за локальную переменную, так как имена одинаковые.
C++ тоже показывает 832.0, на С почему-то не смог запустить. UrsaBoss, вообще, используй нативки, они точнее будут нахождения дистанции "руками" в данном случае. Но не используй Pow(), эта функция очень неточная.
constant native IsUnitInRange takes unit whichUnit, unit otherUnit, real distance returns boolean
constant native IsUnitInRangeXY takes unit whichUnit, real x, real y, real distance returns boolean
constant native IsUnitInRangeLoc takes unit whichUnit, location whichLocation, real distance returns boolean
На сайте, вот тут, есть хорошая статья об этом. Там не совсем то, что вам нужно, но на базе данного примера вы сможете создать всё самостоятельно.
+
И, между прочим, старый форум ещё никто не отменял.
Caster = юнит, применивший скил
PointCaster = позиция кастера
PointTarget = точка скила
PointMiddle = Расстояние между PointCaster и PointTarget делить на 2 (середина прыжка, где будет его максимальная высота, потом снижение)
RealDistance = 0 (расстояние, на которое юнит будет двигаться каждую 0.01)
RealHeight = 0 (высота)
Включить Timer, который зазвонит через 0.01 секунд
В таймере:
PointCasterNow = позиция Caster
PointMove = PointCasterNow смещение на RealDistance
Двигать Caster в PointMove
RealHeight = корень из RealDistance (сама формула)
Установить высоту Caster как RealHeight
*Если расстояние между PointMove и PointMiddle = 0
-То,
RealDistance = RealDistance - 1
-Иначе,
RealDistance = RealDistance + 1 (или сколько хочешь)
*Если расстояние между PointMove и PointTarget = 0
-То,
Пауза Timer
-Иначе,
-
Утечки сам удалишь.
Ну или иначе вот сама формула на джассе
function ParabolaZ takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
h - максимальная высота в прыжке на середине расстояния (x = d / 2),
d - общее расстояние до цели,
x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
А что не понятного? Крашится при уничтожении базы красного, значит перелопать код, который отсится к базе или вообще к красному игроку хоть как-то. Что сложного то?
Опытным путем, спустя второй день нервов, нашел выход. Я снова импортировал текст в карту, и она перестала крашиться. Почему отсутствие текста влияло на неё, не знаю.
а открыть редактор и посмотреть самому не вариант? У логова еще способность "склад" есть, чтобы рабы вмещались. Аналогично чтобы работало пожирание надо добавлять "еду"
Цунами, буран, образование водоворота, оползни (триггерно).
Можно реализовать что угодно на нормальной физической модели, у Melissa в большом паке наработок есть. С грамотным подходом можно реализовать любой катаклизм.
» WarCraft 3 / Как повернуть здания?
» WarCraft 3 / Скрытые в .mpq модели
» WarCraft 3 / Координаты панели
» WarCraft 3 / Эффект при использовании способности
» WarCraft 3 / Выбрать юнитов, выделенные игроком при условии.
» WarCraft 3 / Музыкальное оформление.
» WarCraft 3 / Спец эффекты
» WarCraft 3 / Баг в карте
» WarCraft 3 / Описание предметов
» WarCraft 3 / Проблема с анимацией атаки
» WarCraft 3 / Эффекты юнита
» WarCraft 3 / Создание формации
» WarCraft 3 / Область утечки
» WarCraft 3 / Триггерные атрибуты
» WarCraft 3 / Используется сразу две способности
» WarCraft 3 / Таверна Героев
» WarCraft 3 / Удален
» WarCraft 3 / Не могу найти проблему
» WarCraft 3 / Как сделать триггер
» WarCraft 3 / Как найти ближайший разрушаемый объект?
» WarCraft 3 / Поиск карты
» WarCraft 3 / Прыжок
» WarCraft 3 / Краш
» WarCraft 3 / Землетрясение